package com.fpswork.util;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import com.fpswork.core.exception.exception.BusinessException;



/**
 * File Description:Sumec使用的跟日期相关的工具类
 * Modify History:
 * 20171117：增加方法名的注释
 */

public final class DateUtils {
	public static final SimpleDateFormat DBSF = new SimpleDateFormat(
			"yyyyMMdd HH:mm:ss");

	public static final String F_YYYY = "yyyy";
	public static final String F_YYYYMM = "yyyyMM";
	public static final String F_YYYY_MM = "yyyy-MM";
	public static final String F_YYYYMMDD = "yyyyMMdd";
	public static final String F_YYYY_MM_dd = "yyyy-MM-dd";
	public static final String F_YYYY_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";
	public static void main(String[] args){
		System.out.print(DateUtils.getServerDate("yyyy-MM-dd HH:mm:ss"));
	}
    
	/**
	 * 根据传入的指定日期和返回日期的格式要求
	 * 计算指定日期前一天的日期字符
	 * @param strDate 类型：String 指定日期
	 * @param strFormat 类型：String 指定的返回格式（SumecDateUtils类中的静态常量）
	 * @return String 计算后的日期可能是null
	 * @author spf
	 * @date 2014-4-2 上午7:44:22
	 */
	public static String getPreviousDay(String strDate, String strFormat) {
		return getSpecStepDate(strDate, strFormat, Calendar.DAY_OF_MONTH, -1);
	}

	/**
	 * 获取指定步长日期
	 * calendarType 1：年，2：月，3/4：周，5/6/7：天
	 * @param sDate
	 * @param format
	 * @author spf
	 * @date 2014-4-4 上午5:59:12
	 */
	public static String getSpecStepDate(String sDate, String format,
			int calendarType, int step) {
		try {
			SimpleDateFormat sf = new SimpleDateFormat(format);
			Date date = sf.parse(sDate);
			Calendar c = Calendar.getInstance();
			c.setTime(date);
			c.add(calendarType, step);
			Date nowDate = c.getTime();
			return sf.format(nowDate);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获取服务器时间
	 * @param format
	 * @return
	 * @author spf
	 * @date 2014-4-9 下午12:32:42
	 */
	public static String getServerDate(String format){
		try{
			return new SimpleDateFormat(format).format((Calendar.getInstance(TimeZone.getTimeZone("GMT+8")).getTime()));
		}catch (Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	/**
	 * 比较日期大小  d1>d2 返回 1; d1=d2 返回 0；d1<d2 返回 -1。
	 * @param d1
	 * @param d2
	 * @return
	 * @author spf
	 * @date 2014-4-9 下午12:34:01
	 */
	public static int compareTwoDate(Date d1,Date d2){
		if(d1.after(d2)){
			return 1;
		}else if(d1.before(d2)){
			return -1;
		}else{
			return 0;
		}
	}
	
	/**
	 * 比较日期大小  d1>d2 返回 1; d1=d2 返回 0；d1<d2 返回 -1。
	 * @param d1
	 * @param d2
	 * @return
	 * @author spf
	 * @throws BusinessException 
	 * @throws ParseException 
	 * @date 2014-4-9 下午12:34:01
	 */
	public static int compareTwoDate(String d1,String d2,String format) throws BusinessException{
		try{
			SimpleDateFormat sf=new SimpleDateFormat(format);
			Date dd1=sf.parse(d1);
			Date dd2=sf.parse(d2);
			
			return compareTwoDate(dd1, dd2);
		}catch(Exception e){
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
		
	}
	
	/**
	 * 字符串的日期格式的计算   d2-d1 之间的天数
	 * @param d1 较小的时间
	 * @param d2 较大的时间
	 * @return 相差天数 
	 * @throws ParseException
	 * @title daysBetween 
	 * @author spf
	 * @date 2015-8-31 下午3:32:08
	 */
	public static int daysBetween(String d1,String d2) throws ParseException{  
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");  
		Calendar cal = Calendar.getInstance();    
		cal.setTime(sdf.parse(d1));    
		long time1 = cal.getTimeInMillis();                 
		cal.setTime(sdf.parse(d2));    
		long time2 = cal.getTimeInMillis();         
		long between_days=(time2-time1)/(1000*3600*24);  
			
	    return Integer.parseInt(String.valueOf(between_days));     
	} 
	
	/**
	 * 计算两个日期之间相差的天数    d2-d1 之间的天数
	 * @param d1 较小的时间
	 * @param d2 较大的时间
	 * @return 相差天数 
	 * @throws ParseException
	 * @title daysBetween 
	 * @author spf
	 * @date 2015-8-31 下午3:32:08
	 */   
	public static int daysBetween(Date d1,Date d2) throws ParseException    
	{    
	    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");  
	    d1=sdf.parse(sdf.format(d1));  
	    d2=sdf.parse(sdf.format(d2));  
	    Calendar cal = Calendar.getInstance();    
	    cal.setTime(d1);    
	    long time1 = cal.getTimeInMillis();                 
	    cal.setTime(d2);    
	    long time2 = cal.getTimeInMillis();         
	    long between_days=(time2-time1)/(1000*3600*24);  
	        
	    return Integer.parseInt(String.valueOf(between_days));           
	}
	
	/**
	 * 根据日期返回年份的数值
	 * @Description: 
	 * @author spf
	 * @date:2015-11-3 下午2:04:28
	 * @param d
	 * @return
	 */
	public static int getYear(Date d){
		Calendar cal = Calendar.getInstance();
		cal.setTime(d);	
		return cal.get(Calendar.YEAR);
		
	} 
	
	/**
	 * 根据日期返回月份的数值
	 * @Description: 
	 * @author spf
	 * @date:2015-11-3 下午2:03:42
	 * @param d
	 * @return
	 */
	public static int getMonth(Date d){
		Calendar cal = Calendar.getInstance();
		cal.setTime(d);
		return cal.get(Calendar.MONTH) + 1;
		
	} 
	
	/**
	 * 根据日期返回天的数值
	 * @Description: 
	 * @author spf
	 * @date:2015-11-3 下午2:09:36
	 * @param d
	 * @return
	 */
	public static int getDay(Date d){
		Calendar cal = Calendar.getInstance();
		cal.setTime(d);
		return cal.get(Calendar.DATE);
		
	}
	
	/**
	 * 根据日期返回星期几
	 * @Description: 
	 * @author spf
	 * @date:2015-11-3 下午2:27:15
	 * @return
	 */
	public static String getWeekDay(Date d){
		String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
		Calendar cal = Calendar.getInstance();
		cal.setTime(d);
		return weekDays[cal.get(Calendar.DAY_OF_WEEK) - 1];
	}
	
	/**
	 * 根据format样式要求，将Date类型的日期转换成String类型的
	 * @Description: 
	 * @author spf
	 * @date:2015-11-3 下午2:32:50
	 * @param d
	 * @param format
	 * @return
	 */
	public static String format(Date d,String format){
		if(null == d){
			return null;
		}
		
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		
		return sdf.format(d);
	}
	
	public static String format(Date d){
		return format(d,DateUtils.F_YYYY_MM_dd);
	}
	
	/**
	 * 返回Timestamp的String样式
	 * @Description: 
	 * @author spf
	 * @date:2015-11-3 下午2:50:33
	 * @param ts
	 * @param format
	 * @return
	 */
	public static String format(Timestamp ts,String format){
		if(null == ts){
			return null;
		}
		
		Date date = new Date(ts.getTime());
		
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		
		return sdf.format(date);
	}
	
	public static String format(Timestamp ts){
		return format(ts,DateUtils.F_YYYY_MM_dd_HH_mm_ss);
	}
	
	/**
	 * 根据String日期返回Date值
	 * @Description: 
	 * @author spf
	 * @date:2015-11-3 下午2:44:37
	 * @param strDate
	 * @return
	 */
	public static Date parse(String strDate,String format){
		if(null == strDate || "".equals(strDate)){
			return null;
		}
		
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		
		try {
			return sdf.parse(strDate);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public static Date parse(String strDate){
		return DateUtils.parse(strDate, DateUtils.F_YYYY_MM_dd);
	}
	
	
}
